package com.lord.otter.component.utils;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * java.util.Collection 类 工具包
 *
 * @author lord
 * 2025/7/1 22:30
 */
public class CollKit {

    /**
     * 将集合转换为Map（key冲突则使用第一个值）
     *
     * @param elements       源集合
     * @param keyExtractor   键提取函数
     * @param valueExtractor 值提取函数
     * @author lord
     * 2025/7/2 10:19
     */
    public static <Element, Key, Value> Map<Key, Value> toMap(
            Collection<Element> elements,
            Function<Element, Key> keyExtractor,
            Function<Element, Value> valueExtractor
    ) {
        return toMap(
                elements,
                keyExtractor,
                valueExtractor,
                (first, second) -> first
        );
    }

    /**
     * 将集合转换为Map（key冲突则使用最后的值）
     *
     * @param elements       源集合
     * @param keyExtractor   键提取函数
     * @param valueExtractor 值提取函数
     * @author lord
     * 2025/7/2 10:19
     */
    public static <Element, Key, Value> Map<Key, Value> toMapSecond(
            Collection<Element> elements,
            Function<Element, Key> keyExtractor,
            Function<Element, Value> valueExtractor
    ) {
        return toMap(
                elements,
                keyExtractor,
                valueExtractor,
                (first, second) -> second
        );
    }

    /**
     * 将集合转换为Map（key冲突则抛出异常）
     *
     * @param elements       源集合
     * @param keyExtractor   键提取函数
     * @param valueExtractor 值提取函数
     * @author lord
     * 2025/7/2 10:19
     */
    public static <Element, Key, Value> Map<Key, Value> toMapThrow(
            Collection<Element> elements,
            Function<Element, Key> keyExtractor,
            Function<Element, Value> valueExtractor
    ) {
        return toMap(
                elements,
                keyExtractor,
                valueExtractor,
                (first, second) -> {
                    throw new IllegalStateException("检测到重复键 Duplicate key detected");
                }
        );
    }


    /**
     * 将集合转换为Map（自定义冲突处理策略）
     *
     * @param elements       源集合
     * @param keyExtractor   键提取函数
     * @param valueExtractor 值提取函数
     * @param mergeFunction  键冲突处理策略（当遇到重复键时调用）
     * @param <Element>      集合元素类型
     * @param <Key>          键类型
     * @param <Value>        值类型
     * @return 转换后的Map
     */
    public static <Element, Key, Value> Map<Key, Value> toMap(
            Collection<Element> elements,
            Function<Element, Key> keyExtractor,
            Function<Element, Value> valueExtractor,
            BinaryOperator<Value> mergeFunction
    ) {
        if (elements == null || elements.isEmpty()) {
            return new HashMap<>();
        }
        return elements.stream().collect(
                Collectors.toMap(
                        keyExtractor,
                        valueExtractor,
                        mergeFunction
                )
        );
    }

}
